#ifndef __SIMPLE_PROTOCOL_H__
#define __SIMPLE_PROTOCOL_H__

#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include <stdint.h>
#define SIMPLE_PROTOCOL_AUTH_LEN 12
#define SIMPLE_PROTOCOL_DATA_LEN 257
#pragma pack(1)
    typedef struct simple_protocol_st
    {
        int8_t head;                           // 消息头 固定 0x9E
        uint8_t id;                            // 消息类型 0xff (目前最多支持16种数据格式)
        uint8_t packs_len;                     // 分包长度    不分包:0x00
        uint8_t pack;                          // 包号    不分包:0x00 分包:0x00开始 0xFF结束
        int8_t auth[SIMPLE_PROTOCOL_AUTH_LEN]; // 客户端标号 12位
        uint8_t len;                           // 消息长度 最多256
        int8_t data[SIMPLE_PROTOCOL_DATA_LEN]; // 载荷 多一位放 \0
        int8_t saved;                          // 保留位
        int8_t tail;                           // 消息尾
    } simple_protocol_t;
#pragma pack()

// 头标记
#define SIMPLE_PROTOCOL_HEAD 0x9E
// 尾标记
#define SIMPLE_PROTOCOL_TAIL 0x9E

// 心跳id
#define SIMPLE_PROTOCOL_HEARTBEAT_ID 0x0

// 普通交谈id
#define SIMPLE_PROTOCOL_AC_ID 0x1

// 鉴权id
#define SIMPLE_PROTOCOL_AUTH_ID 0x02

// 文件id
#define SIMPLE_PROTOCOL_FILE_ID 0x03

// 不分包
#define SIMPLE_PROTOCOL_NOPACK 0x00

    typedef int (*simple_protocol_cb_impl)(simple_protocol_t *ptr, void *userdata);

    extern int simple_protocol_set(simple_protocol_t *ptr, uint8_t id, uint8_t packs_len, uint8_t pack, const int8_t *auth, const int8_t *data);
    extern int simple_protocol_nopack_set(simple_protocol_t *ptr, uint8_t id, const int8_t *auth, const int8_t *data);

    extern int simple_protocol_global_cb_set(uint8_t id, simple_protocol_cb_impl func);
    extern int simple_protocol_global_cb_run(simple_protocol_t *ptr, void *userdata);
    extern int simple_protocol_run(simple_protocol_t *ptr, simple_protocol_cb_impl func, void *userdata);

#ifdef __cplusplus
}
#endif

#endif